#include "vbsp.h"
#include <stdio.h>

// 全局文件指针，用于写入SPI数据
static FILE *spi_log_file = NULL;

// 初始化函数：打开spi.dat文件
void spi_log_init(void) {
    spi_log_file = fopen("spi.dat", "w");
    if (spi_log_file == NULL) {
        // 可根据需要添加错误处理（如输出到stderr）
        return;
    }
    // 设置无缓冲模式，确保数据实时写入文件
    setvbuf(spi_log_file, NULL, _IONBF, 0);
}

// 关闭函数：确保文件正确关闭
void spi_log_close(void) {
    if (spi_log_file != NULL) {
        fclose(spi_log_file);
        spi_log_file = NULL;
    }
}

void gpio_bit_reset(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) {
    if (GPIOx == GPIOA) {
        if (GPIO_Pin & GPIO_PIN_5)      gpio_state.PA5 = 0;
        else if (GPIO_Pin & GPIO_PIN_6) gpio_state.PA6 = 0;
        else if (GPIO_Pin & GPIO_PIN_7) gpio_state.PA7 = 0;
        
        // 写入文件而非标准输出
        if (spi_log_file != NULL) {
            fprintf(spi_log_file, "[GPIO] PA5(SCK):%d PA6(SS):%d PA7(MOSI):%d\n",
                    gpio_state.PA5, gpio_state.PA6, gpio_state.PA7);
        }
    }
}

void gpio_bit_set(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) {
    if (GPIOx == GPIOA) {
        if (GPIO_Pin & GPIO_PIN_5)      gpio_state.PA5 = 1;
        else if (GPIO_Pin & GPIO_PIN_6) gpio_state.PA6 = 1;
        else if (GPIO_Pin & GPIO_PIN_7) gpio_state.PA7 = 1;
        
        if (spi_log_file != NULL) {
            fprintf(spi_log_file, "[GPIO] PA5(SCK):%d PA6(SS):%d PA7(MOSI):%d\n",
                    gpio_state.PA5, gpio_state.PA6, gpio_state.PA7);
        }
    }
}

void vbsp_spi_delay(uint32_t ms) {
    if (spi_log_file != NULL) {
        fprintf(spi_log_file, "[DELAY] %dms\n", ms);
    }
    // 实际项目中可以加上Sleep(ms)
}
